/*
 * 教材中的示例程序之完整版.
 * 书名：《编译原理基础》
 * 版次：第三版
 * 作者：王献青，张立勇，张淑平，刘坚
 * 出版社：西安电子科技大学出版社
 * 程序完成时间：2025.03
 */

//
// 文件内容： 词法分析的简易测试驱动程序
//

#include <stdio.h>
#include <string.h>

#include "lexer.h"

static const char * test_input =    // 测试数据
    "< <= ! != = == > >= \t"        // Good
    "123 12.34 1E+2 1.2E-1\t"       // Good
    ".5 1. 1.x 1Ex 1E-x\n"          // Bad sequence
    "pos _F_O_O_ a12 \n"            // Good ID
    "12<3.4<=5E+"                   // Error at EOF
    ;


/*
 * 命令行参数约定：
 * argv[1]: 设置本次程序执行所用的记号识别函数. 取值为：
 *   1: 直接编码的_1: 基于状态变量变化的实现
 *   2: 直接编码的_2: 基于 goto 的实现
 *   3或其他值: 手工编码的:   递归下降风格的实现
 */
int main(int argc, char * argv[]) {
    int  style = 0;
    if ( argc > 1 ) {
        if(0 == strcmp("1", argv[1])) style = 1;
        else if(0 == strcmp("2", argv[1])) style = 2;
        else if(0 == strcmp("3", argv[1])) style = 3;
        else  {
            printf("Bad argument-1, it must be 1,2,or 3.\n");
            return 1;
        }
    }

    set_lexer_style(style);
    set_lexer_input(test_input);

    int counter = 0;
    TokenKind tokenKind;
    printf("\nPerforms recognize-words in style %d\n", style);
    while (1){
        tokenKind = nextToken();
        printf("%2d:  %-6s  [%.*s]\n",
               ++counter,
               lookup_kindname(tokenKind),
               get_word_length(), //单词的长度
               get_word_begin());
        if (tokenKind == EOFS) break;
    }

    printf("Finished recognize-words in style %d.\n", style);

    return 0;
}
